package top.chukongxiang.project.base.utils;


/**
 * office工具类，需要依赖poi工具
 */
public class OfficeUtils {

    /**
     * Word工具
     */
//    public static class WordUtils {
//
//        private static final String label = "$";
//        private static final String prefix = "{";
//        private static final String suffix = "}";
//
//          /**
//           * 替换word单词
//           */
//        public static byte[] replaceWord(WordDocument word, Map<String,Object> data) throws IOException {
//            ByteArrayInputStream byteArrayInputStream = null;
//            try {
//                byteArrayInputStream = new ByteArrayInputStream(word.getContent());
//                if("docx".equals(word.getFormat().toLowerCase())){
//                    XWPFDocument document = new XWPFDocument(byteArrayInputStream);
//                    return replaceWord2006(document,data);
//                } else if("doc".equals(word.getFormat().toLowerCase())){
//                    HWPFDocument document = new HWPFDocument(byteArrayInputStream);
//                    return replaceWord2003(document,data);
//                } else{
//                    throw new RuntimeException("文件不能被解析");
//                }
//            } finally {
//                if (byteArrayInputStream!=null) byteArrayInputStream.close();
//            }
//        }
//
//
//        public static byte[] replaceWord2006(XWPFDocument document, Map<String, Object> dataContent) throws IOException {
//            /**
//             * 替换段落中指定的文本
//             */
//            for (XWPFParagraph paragraph : document.getParagraphs()) {
//                List<XWPFRun> runs = paragraph.getRuns();
//                replace2006String(dataContent, runs);
//            }
//            /**
//             * 替换表格中指定的文字
//             */
//            for (XWPFTable tab : document.getTables()) {
//                for (XWPFTableRow row : tab.getRows()) {
//                    for (XWPFTableCell cell : row.getTableCells()) {
//                        //注意，getParagraphs一定不能漏掉
//                        //因为一个表格里面可能会有多个需要替换的文字
//                        //如果没有这个步骤那么文字会替换不了
//                        for (XWPFParagraph p : cell.getParagraphs()) {
//                            List<XWPFRun> runs = p.getRuns();
//                            replace2006String(dataContent, runs);
//                        }
//                    }
//                }
//            }
//            ByteArrayOutputStream baos = new ByteArrayOutputStream();
//            document.write(baos);//不需要关闭，关闭后会修改源文档
//            baos.flush();
//            byte[] bytes = baos.toByteArray();
//            baos.close();
//            return bytes;
//        }
//
//        /**
//         * 保留文本格式替换，待寻找更好的方法
//         * @param dataContent
//         * @param runs
//         */
//        private static void replace2006String(Map<String, Object> dataContent, List<XWPFRun> runs) {
//            if (runs == null) return;
//            //合并逻辑
//            //定义每次循环开始时的查找状态 seachPre 为tru时代表当前正在寻找prefix，false为寻找suffix
//            int labelIndex = -1,labelRun = -1; boolean labelIsFanish = false;
//            int preIndex = -1,preRun = -1;
//            int sufIndex = -1,sufRun = -1;
//            for(int i=0;i<runs.size();i++){
//                String text0 = runs.get(i).getText(runs.get(i).getTextPosition());
//                int tempLabelIndex = text0.indexOf(label);
//                if(tempLabelIndex!=-1){
//                    labelIndex = tempLabelIndex;
//                    labelRun = i;
//                    labelIsFanish = text0.endsWith(label);
//                }
//                int tempPreIndex = text0.indexOf(prefix);
//                if(tempPreIndex!=-1){ preRun = i; preIndex=tempPreIndex; }
//                int tempSufIndex = text0.indexOf(suffix);
//                if(tempSufIndex!=-1) {sufRun = i;sufIndex=tempSufIndex;}
//                if(labelIndex!=-1 && labelRun!=-1 && preIndex!=-1 && preRun!=-1 && sufIndex!=-1 && sufRun!=-1){
//                    //标志符和前缀必须紧挨着
//                    //如果不是紧挨着，重新寻找$
//                    if(!((labelRun==preRun && labelIndex+1==preIndex) || (labelRun!=preRun && labelRun+1==preRun && labelIsFanish && preIndex==0))){
//                        labelIndex = -1;labelRun = -1;labelIsFanish=false;preIndex = -1;preRun = -1;sufIndex = -1;sufRun = -1;
//                        continue;
//                    }
//                    //所有key在同一个run内
//                    if(labelRun==preRun && preRun==sufRun){
//                        String key = runs.get(labelRun).getText(runs.get(labelRun).getTextPosition()).substring(preIndex+1,sufIndex);
//                        if(dataContent.containsKey(key)){
//                            runs.get(preRun).setText(
//                                    StringUtils.replace(runs.get(labelRun).getText(runs.get(labelRun).getTextPosition()),dataContent.get(key)==null?"":dataContent.get(key).toString(),labelIndex,sufIndex+1),0
//                            );
//                        }
//                        labelIndex = -1;labelRun = -1;labelIsFanish=false;preIndex = -1;preRun = -1;sufIndex = -1;sufRun = -1;
//                    }
//                    //标签和前缀在同一个run内 ，后缀不在
//                    else if(labelRun==preRun && preRun!=sufRun){
//                        String nextText = runs.get(preRun).toString().substring(preIndex+1);
//                        StringBuffer sb = new StringBuffer();
//                        sb.append(nextText);
//                        //中间隔着的run
//                        for(int j=preRun+1;j<sufRun;j++){
//                            sb.append(runs.get(j));
//                        }
//                        String key = sb.append(runs.get(sufRun).toString().substring(0,sufIndex)).toString();
//                        if(dataContent.containsKey(key)){
//                            runs.get(preRun).setText(runs.get(preRun).toString().substring(0,labelIndex)+(dataContent.get(key)==null?"":dataContent.get(key).toString()),0);
//                            for(int j=preRun+1;j<sufRun;j++) runs.get(j).setText("",0);
//                            runs.get(sufRun).setText(runs.get(sufRun).toString().substring(sufIndex+1),0);
//                        }
//                        labelIndex = -1;labelRun = -1;labelIsFanish=false;preIndex = -1;preRun = -1;sufIndex = -1;sufRun = -1;
//                    }
//                    //前缀和后缀在同一个run内，标签不在
//                    else if(preRun==sufRun && labelRun!=preRun){
//                        String key = runs.get(preRun).getText(runs.get(preRun).getTextPosition()).substring(preIndex+1,sufIndex);
//                        if(dataContent.containsKey(key)){
//                            String replaced = StringUtils.replace(runs.get(labelRun).getText(runs.get(labelRun).getTextPosition()), "", labelIndex, labelIndex + 1);
//                            runs.get(labelRun).setText(replaced,0);
//                            String replaced1 = StringUtils.replace(runs.get(preRun).toString(), dataContent.get(key)==null?"":dataContent.get(key).toString(), preIndex, sufIndex+1);
//                            runs.get(preRun).setText(replaced1,0);
//                        }
//                        labelIndex = -1;labelRun = -1;labelIsFanish=false;preIndex = -1;preRun = -1;sufIndex = -1;sufRun = -1;
//
//                    }
//                    //标签前缀后缀全都不在同一个run内
//                    else if(labelRun!=preRun && preRun!=sufRun && labelRun!=sufRun){
//                        //得到前缀run 截取前缀后面的字符串
//                        StringBuffer sb = new StringBuffer();
//                        sb.append(runs.get(preRun).toString().substring(preIndex+1));
//                        //得到间隔run的内容
//                        for(int j=preRun+1;j<sufRun;j++){
//                            sb.append(runs.get(j));
//                        }
//                        //截取后缀run 截取后缀前面的字符串
//                        sb.append(runs.get(sufRun).toString().substring(0,sufIndex));
//                        String key = sb.toString();
//                        if(dataContent.containsKey(key)){
//                            System.out.println(key+"--"+dataContent.get(key));
//                            //删掉标签
//                            runs.get(labelRun).setText(runs.get(labelIndex).toString().substring(0,labelIndex),0);
//                            //删掉 中间的run的内容
//                            for(int j=preRun;j<sufRun;j++) runs.get(j).setText("",0);
//                            //删掉 后缀之前的内容
//                            runs.get(sufRun).setText(runs.get(sufRun).toString().substring(sufIndex+1),0);
//                            //将内容设置到prefix
//                            runs.get(preRun).setText(dataContent.get(key)==null?"":dataContent.get(key).toString());
//                        }
//                        labelIndex = -1;labelRun = -1;labelIsFanish=false;preIndex = -1;preRun = -1;sufIndex = -1;sufRun = -1;
//                    }
//                }
//            }
//        }
//
//        public static byte[] replaceWord2003(HWPFDocument document, Map<String,Object> data) throws IOException {
//            return replace2003String(document,data);
//        }
//
//        public static byte[] replace2003String(HWPFDocument document, Map<String,Object> data)throws IOException{
//            Range range = document.getRange();
//            for(String key:data.keySet()){
//                //System.out.println(range.text());
//                range.replaceText(label+prefix+key+suffix, data.get(key)==null?"":data.get(key).toString());
//            }
//            ByteArrayOutputStream baos = new ByteArrayOutputStream();
//            document.write(baos);
//            baos.flush();
//            byte[] bytes = baos.toByteArray();
//            baos.close();
//            return bytes;
//        }
//
//    }

}
